﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MySql.Data.MySqlClient;
using System.Web.Helpers;
using System.Net.Mail;
using AtlasPlantasMedicinales.Models;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

namespace AtlasPlantasMedicinales.Controllers
{
    public class HomeController : Controller
    {
        private MySqlConnection connection;
        private string server;
        private string database;
        private string uid;
        private string password;

        private BuscarPlanta GetPInicial()
        {
            var model = new BuscarPlanta();
            var selectedCat = new List<CategoriasBuscarPlanta>();
            model.categorias = CategoriasRepository.GetAll().ToList();
            model.categoriasSelect = selectedCat;
            return model;
        }

        private BuscarPlanta GetPModel(BuscarPlanta P)
        {
            P.categorias = CategoriasRepository.GetAll().ToList();
            int n = P.PostedCategorias.IdsCategorias.Length;
            for (int i = 0; i < n; i++)
                P.categorias[Convert.ToInt16(P.PostedCategorias.IdsCategorias[i]) - 1].IsSelected = true;
            return P;
        }

        public ActionResult PasswordRecovery()
        {
            ViewBag.autenticado = TempData["IS"];
            TempData["IS"] = ViewBag.autenticado;
            ViewBag.categoria = TempData["Categoria"];
            TempData["Categoria"] = ViewBag.categoria;
            ViewBag.NombreUsuario = TempData["NombreUsuario"];
            TempData["NombreUsuario"] = ViewBag.NombreUsuario;
            ViewBag.Usuario_objeto = TempData["Usuario_objeto"];
            TempData["Usuario_objeto"] = ViewBag.Usuario_objeto;
            return View();
        }

        [HttpPost]
        public ActionResult PasswordRecovery(Usuario user)
        {
            ViewBag.autenticado = TempData["IS"];
            TempData["IS"] = ViewBag.autenticado;
            ViewBag.categoria = TempData["Categoria"];
            TempData["Categoria"] = ViewBag.categoria;
            ViewBag.NombreUsuario = TempData["NombreUsuario"];
            TempData["NombreUsuario"] = ViewBag.NombreUsuario;
            ViewBag.Usuario_objeto = TempData["Usuario_objeto"];
            TempData["Usuario_objeto"] = ViewBag.Usuario_objeto;

            if (!user.usuario.Equals(""))
            {
                server = "localhost";
                database = "atlas_de_plantas_medicinales";
                uid = "root";
                password = "123456";
                string connectionString;
                connectionString = "SERVER=" + server + ";" + "DATABASE=" +
                database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
                connection = new MySqlConnection(connectionString);
                connection.Open();
                String query = "SELECT * FROM Usuarios WHERE Usuario='" + user.usuario + "'";
                MySqlCommand comando = new MySqlCommand(query, connection);
                MySqlDataReader dataReader = comando.ExecuteReader();
                String usr = "", contrasena="", correo="";
                while (dataReader.Read())
                {
                    usr = (String)dataReader["Usuario"];
                    contrasena = (String)dataReader["Contrasena"];
                    correo = (String)dataReader["Correo"];
                }
                connection.Close();
                if (!usr.Equals(""))
                {
                    MailMessage msg = new MailMessage();
                    msg.From = new MailAddress("admin@uvg.edu.gt","Administrador");
                    msg.To.Add(new MailAddress(correo));
                    msg.Subject = "Recuperación de contraseña";
                    msg.Body = "Estimado usuario,\n\n su contraseña es: " + contrasena + "\n\nAdministrador";
                    SmtpClient cliente = new SmtpClient();
                    cliente.Host = "127.0.0.1";
                    cliente.Port = 25292;
                    cliente.Send(msg);
                }
                else
                {
                    ModelState.AddModelError("", "El nombre de usuario es incorrecto.");
                    return View(user);
                }
                return View("Administracion");
            }
            else
            {
                ModelState.AddModelError("", "El nombre de usuario es incorrecto.");
                return View(user);
            }
        }


        public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
            if (TempData["IS"] == null)
                ViewBag.autenticado = true;
            else
                ViewBag.autenticado = TempData["IS"];

            if (TempData["Categoria"] == null)
                ViewBag.categoria = 4;
            else
                ViewBag.categoria = TempData["Categoria"];

            TempData["Categoria"] = ViewBag.categoria;
            TempData["IS"] = ViewBag.autenticado;
            ViewBag.NombreUsuario = TempData["NombreUsuario"];
            TempData["NombreUsuario"] = ViewBag.NombreUsuario;
            ViewBag.Usuario_objeto = TempData["Usuario_objeto"];
            TempData["Usuario_objeto"] = ViewBag.Usuario_objeto;
            return View(GetPInicial());
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";
            if (TempData["IS"] == null)
                ViewBag.autenticado = true;
            else
                ViewBag.autenticado = TempData["IS"];
            
            if (TempData["Categoria"] == null)
                ViewBag.categoria = 4;
            else
                ViewBag.categoria = TempData["Categoria"];

            TempData["Categoria"] = ViewBag.categoria;
            TempData["IS"] = ViewBag.autenticado;
            ViewBag.NombreUsuario = TempData["NombreUsuario"];
            TempData["NombreUsuario"] = ViewBag.NombreUsuario;
            ViewBag.Usuario_objeto = TempData["Usuario_objeto"];
            TempData["Usuario_objeto"] = ViewBag.Usuario_objeto;
            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";
            if (TempData["IS"] == null)
                ViewBag.autenticado = true;
            else
                ViewBag.autenticado = TempData["IS"];
            if (TempData["Categoria"] == null)
                ViewBag.categoria = 4;
            else
                ViewBag.categoria = TempData["Categoria"];

            TempData["Categoria"] = ViewBag.categoria;
            TempData["IS"] = ViewBag.autenticado;
            ViewBag.NombreUsuario = TempData["NombreUsuario"];
            TempData["NombreUsuario"] = ViewBag.NombreUsuario;
            ViewBag.Usuario_objeto = TempData["Usuario_objeto"];
            TempData["Usuario_objeto"] = ViewBag.Usuario_objeto;
            return View();
        }

        [HttpPost]
        public void crearPDF()
        {
            ArticuloCientifico AC = (ArticuloCientifico)TempData["datosParaLaPlanta"];
            String deptos = (String)TempData["NombresDepartamentos"];
            using (MemoryStream ms = new MemoryStream())
            using (Document document = new Document(PageSize.LETTER, 25, 25, 30, 30))
            using (PdfWriter writer = PdfWriter.GetInstance(document, ms))
            {
                document.Open();
                document.Add(new Paragraph(AC.NombreCientifico));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Familia\n"+AC.Familia));
                document.Add(new Paragraph(" "));                
                document.Add(new Paragraph("Definición\n" + AC.Definicion));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Sinónimo\n" + AC.Sinonimo));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Descripción\n" + AC.Descripcion));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Nombre vernacular\n" + AC.NombreVernacular));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Departamentos donde se encuentra\n" + deptos));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Planta de interés - Apariencia general\n" + AC.PlantaInteres.AparienciaGeneral));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Planta de interés - Propiedades organolépticas\n" + AC.PlantaInteres.PropOrganolepticas));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Planta de interés - Características microscópicas\n" + AC.PlantaInteres.CaracteristicasMicro));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Planta de interés - Material vegetal en polvo\n" + AC.PlantaInteres.MaterialVegEnPolvo));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Pruebas de identidad general\n" + AC.PruebasIdentGeneral));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Nombre vernacular\n" + AC.NombreVernacular));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Prueba de pureza - Microbiológicas\n" + AC.PruebaPureza.Microbiologicas));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Prueba de pureza - Materia orgánica extraña\n" + AC.PruebaPureza.MateriaOrgExtrana));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Prueba de pureza - Cenizas totales\n" + AC.PruebaPureza.CenizasTotales));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Prueba de pureza - Pérdida por secado\n" + AC.PruebaPureza.PerdidaPorSecado));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Prueba de pureza  - Residuos de pesticidas\n" + AC.PruebaPureza.ResiduosDePesticidas));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Prueba de pureza - Metales pesados\n" + AC.PruebaPureza.MetalesPesados));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Prueba de pureza - Residuos radiactivos\n" + AC.PruebaPureza.ResiduosRadiactivos));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Prueba de pureza\n" + AC.PruebaPureza.OtrasPruebasPureza));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Ensayo químico - Metabolito secundario\n" + AC.Ensayo.MetabolitoSecundario));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Ensayo químico - Constitución química\n" + AC.Ensayo.ConstQuimMay));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Uso medicinal - Usos descritos en las farmacopeas y en sistemas tradicionales de medicina\n" + AC.UsoMed.UsoSisTradicional));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Uso medicinal - Usos descritos en la medicina tradicional no validados por datos experimentales o clínicos\n" + AC.UsoMed.UsoSisTradicionalNoVal));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Uso medicinal - Link de padecimiento - Link\n" + AC.UsoMed.LinkPad.Link));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Uso medicinal - Link de padecimiento - Definición\n" + AC.UsoMed.LinkPad.Definicion));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Uso medicinal - Link de padecimiento - Descripción\n" + AC.UsoMed.LinkPad.Descripcion));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Uso medicinal - Link de padecimiento - Causa y síntomas\n" + AC.UsoMed.LinkPad.CausaSintoma));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Uso medicinal - Link de padecimiento - Diagnóstico\n" + AC.UsoMed.LinkPad.Diagnostico));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Uso medicinal - Link de padecimiento - Tratamiento\n" + AC.UsoMed.LinkPad.Tratamiento));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Uso medicinal - Link de padecimiento - Prevención\n" + AC.UsoMed.LinkPad.Prevencion));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Uso medicinal - Link de padecimiento - Esquema\n" + AC.UsoMed.LinkPad.Esquema));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Farmacología - Actividad farmacológica\n" + AC.Farma.ActividadFarmacologica));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Farmacología - Actividad miscelánea\n" + AC.Farma.ActividadMiscelanea));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph("Farmacología - Farmacología clínica\n" + AC.Farma.FarmacologiaClinica));
                document.Add(new Paragraph(" "));                
                document.Add(new Paragraph("Contraindicaciones\n" + AC.Contraindicacion));
                document.Add(new Paragraph(" "));                
                document.Add(new Paragraph("Lista de precauciones\n" + AC.ListaPrecauciones));
                document.Add(new Paragraph(" "));                
                document.Add(new Paragraph("Reacción adversa\n" + AC.ReaccionAdversa));
                document.Add(new Paragraph(" "));                
                document.Add(new Paragraph("Forma de dosificación\n" + AC.FormaDosificacion));
                document.Add(new Paragraph(" "));                
                document.Add(new Paragraph("Posología\n" + AC.Posologia));
                document.Add(new Paragraph(" "));                
                document.Add(new Paragraph("Referencias\n" + AC.Referencias));
                document.Add(new Paragraph(" "));
                document.Add(new Paragraph(" "));                
                document.Add(new Paragraph("Hecho por: \n" + AC.usuario.Nombre));                
                document.Close();
                writer.Close();
                ms.Close();
                Response.ContentType = "pdf/application";
                Response.AddHeader("content-disposition", "attachment;filename="+AC.NombreCientifico+".pdf");
                Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
            }
            
           // return new RazorPDF.PdfResult(AC, "VisualizarPlantaPDF");
        }

        public ActionResult VisualizarPlanta(ArticuloCientifico modelo)
        {
            TempData["mostrarPlanta"] = modelo;
            ViewBag.autenticado = TempData["IS"];
            TempData["IS"] = ViewBag.autenticado;
            ViewBag.categoria = TempData["Categoria"];
            TempData["Categoria"] = ViewBag.categoria;
            ViewBag.NombreUsuario = TempData["NombreUsuario"];
            TempData["NombreUsuario"] = ViewBag.NombreUsuario;
            ViewBag.Usuario_objeto = TempData["Usuario_objeto"];
            TempData["Usuario_objeto"] = ViewBag.Usuario_objeto;

            server = "localhost";
            database = "atlas_de_plantas_medicinales";
            uid = "root";
            password = "123456";
            string connectionString;
            connectionString = "SERVER=" + server + ";" + "DATABASE=" +
            database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
            connection = new MySqlConnection(connectionString);
            
            //Busqueda de los datos en la tabla de plantas
            connection.Open();
            String query = "SELECT * FROM Plantas WHERE ID='" + modelo.ID + "'";
            MySqlCommand comando = new MySqlCommand(query, connection);
            MySqlDataReader dataReader = comando.ExecuteReader();
            String departamentos = "";
            int PlantaDeInteres_ID = 0, PruebaDePureza_ID = 0, EnsayoQuimico_ID = 0, UsoMedicinal_ID = 0, Farmacologia_ID = 0;
            while (dataReader.Read())
            {
                modelo.ID = (int)dataReader["ID"];
                modelo.PathFotoPlanta = (String)dataReader["PathFotoPlanta"];
                modelo.NombreCientifico = (String)dataReader["NombreCientifico"];
                modelo.Familia = (String)dataReader["Familia"];
                modelo.Definicion = (String)dataReader["Definicion"];
                modelo.Sinonimo = (String)dataReader["Sinonimo"];
                modelo.NombreVernacular = (String)dataReader["NombresVernaculares"];
                departamentos = (String)dataReader["DistribucionGeo"];
                modelo.Descripcion = (String)dataReader["Descripcion"];
                PlantaDeInteres_ID = (int)dataReader["PlantaDeInteres_ID"];
                modelo.PruebasIdentGeneral = (String)dataReader["PruebasIdentGeneral"];
                PruebaDePureza_ID = (int)dataReader["PruebaDePureza_ID"];
                EnsayoQuimico_ID = (int)dataReader["EnsayoQuimico_ID"];
                UsoMedicinal_ID = (int)dataReader["UsoMedicinal_ID"];
                Farmacologia_ID = (int)dataReader["Farmacologia_ID"];
                modelo.Contraindicacion = (String)dataReader["Contraindicacion"];
                modelo.ListaPrecauciones = (String)dataReader["ListaPrecauciones"];
                modelo.ReaccionAdversa = (String)dataReader["ReaccionAdversa"];
                modelo.FormaDosificacion = (String)dataReader["FormaDosificacion"];
                modelo.Posologia = (String)dataReader["Posologia"];
                modelo.Referencias = (String)dataReader["Referencias"];
                modelo.comoBorrador = (bool)dataReader["Borrador"];
                modelo.Habilitado = (bool)dataReader["Habilitada"];
            }
            connection.Close();
            
            List<DistribucionGeografica> ListaDep = DepartamentosRepository.GetAll().ToList<DistribucionGeografica>();
            List<String> ListaDB = departamentos.Split(',').ToList<String>();
            
            modelo.departamentos = DepartamentosRepository.GetAll().ToList();
            modelo.PostedDepartamentos.IdsDepartamentos = departamentos.Split(',');
            modelo.departamentosSelect = new List<DistribucionGeografica>();
            int n = modelo.PostedDepartamentos.IdsDepartamentos.Length;
            for (int i = 0; i < n; i++)
                modelo.departamentos[Convert.ToInt16(modelo.PostedDepartamentos.IdsDepartamentos[i]) - 1].IsSelected = true;
            
            departamentos = "";
            foreach (String id in ListaDB){
                departamentos = departamentos + ListaDep[Convert.ToInt16(id)-1].Departamento+", ";
            }
            departamentos = departamentos.Substring(0, departamentos.Length - 2);

            

            //Busqueda de los datos en planta de interes
            connection.Open();
            query = "SELECT * FROM plantadeinteres WHERE ID='" + PlantaDeInteres_ID + "'";
            comando = new MySqlCommand(query, connection);
            dataReader = comando.ExecuteReader();
            modelo.PlantaInteres = new PlantaDeInteres();
            while (dataReader.Read())
            {
                modelo.PlantaInteres.ID = (int)dataReader["ID"];
                modelo.PlantaInteres.AparienciaGeneral = (String)dataReader["AparienciaGeneral"];
                modelo.PlantaInteres.PropOrganolepticas = (String)dataReader["PropOrganolepticas"];
                modelo.PlantaInteres.CaracteristicasMicro = (String)dataReader["CaracteristicasMicro"];
                modelo.PlantaInteres.MaterialVegEnPolvo = (String)dataReader["MaterialVegEnPolvo"];
            }
            connection.Close();

            //Busqueda de los datos en prueba de pureza
            connection.Open();
            query = "SELECT * FROM pruebadepureza WHERE ID='" + PruebaDePureza_ID + "'";
            comando = new MySqlCommand(query, connection);
            dataReader = comando.ExecuteReader();
            modelo.PruebaPureza = new PruebaDePureza();
            while (dataReader.Read())
            {
                modelo.PruebaPureza.ID = (int)dataReader["ID"];
                modelo.PruebaPureza.Microbiologicas = (String)dataReader["Microbiologicas"];
                modelo.PruebaPureza.MateriaOrgExtrana = (String)dataReader["MateriaOrgExtrana"];
                modelo.PruebaPureza.CenizasTotales = (String)dataReader["CenizasTotales"];
                modelo.PruebaPureza.CenizasInsolEnAcido = (String)dataReader["CenizasInsolEnAcido"];
                modelo.PruebaPureza.CenizasSulfatas = (String)dataReader["CenizasSulfatas"];
                modelo.PruebaPureza.PerdidaPorSecado = (String)dataReader["PerdidaPorSecado"];
                modelo.PruebaPureza.ResiduosDePesticidas = (String)dataReader["ResiduoDePesticidas"];
                modelo.PruebaPureza.MetalesPesados = (String)dataReader["MetalesPesados"];
                modelo.PruebaPureza.ResiduosRadiactivos = (String)dataReader["ResiduosRadiactivos"];
                modelo.PruebaPureza.OtrasPruebasPureza = (String)dataReader["OtrasPruebasPureza"];
            }
            connection.Close();

            //Busqueda de los datos en ensayo quimico
            connection.Open();
            query = "SELECT * FROM ensayoquimico WHERE ID='" + EnsayoQuimico_ID + "'";
            comando = new MySqlCommand(query, connection);
            dataReader = comando.ExecuteReader();
            modelo.Ensayo = new EnsayoQuimico();
            while (dataReader.Read())
            {
                modelo.Ensayo.ID = (int)dataReader["ID"];
                modelo.Ensayo.MetabolitoSecundario = (String)dataReader["MetabolitoSecundario"];
                modelo.Ensayo.ConstQuimMay = (String)dataReader["ConstQuimMay"];
                modelo.Ensayo.PathImagenEQ = (String)dataReader["PathImagen"];               
            }
            connection.Close();

            //Busqueda de los datos en uso medicinal
            connection.Open();
            query = "SELECT * FROM usomedicinal WHERE ID='" + UsoMedicinal_ID + "'";
            comando = new MySqlCommand(query, connection);
            dataReader = comando.ExecuteReader();
            int LinkPadecimiento_ID = 0;
            modelo.UsoMed = new UsoMedicinal();
            while (dataReader.Read())
            {
                modelo.UsoMed.ID = (int)dataReader["ID"];
                modelo.UsoMed.UsoSisTradicional = (String)dataReader["UsoSisTradicional"];
                modelo.UsoMed.UsoSisTradicionalNoVal = (String)dataReader["UsoSisTradicionalNoVal"];
                LinkPadecimiento_ID = (int)dataReader["LinkPadecimiento_ID"];
            }
            connection.Close();

            //Busqueda de los datos en link padecimiento
            connection.Open();
            query = "SELECT * FROM linkpadecimiento WHERE ID='" + LinkPadecimiento_ID + "'";
            comando = new MySqlCommand(query, connection);
            dataReader = comando.ExecuteReader();
            modelo.UsoMed.LinkPad = new LinkPadecimiento();
            while (dataReader.Read())
            {
                modelo.UsoMed.LinkPad.ID = (int)dataReader["ID"];
                modelo.UsoMed.LinkPad.Link = (String)dataReader["Link"];
                modelo.UsoMed.LinkPad.Definicion = (String)dataReader["Definicion"];
                modelo.UsoMed.LinkPad.Descripcion = (String)dataReader["Descripcion"];
                modelo.UsoMed.LinkPad.CausaSintoma = (String)dataReader["CausaSintoma"];
                modelo.UsoMed.LinkPad.Diagnostico = (String)dataReader["Diagnostico"];
                modelo.UsoMed.LinkPad.Tratamiento = (String)dataReader["Tratamiento"];
                modelo.UsoMed.LinkPad.Prevencion = (String)dataReader["Prevencion"];
                modelo.UsoMed.LinkPad.Esquema = (String)dataReader["Esquema"];
            }
            connection.Close();

            //Busqueda de los datos en farmacologia
            connection.Open();
            query = "SELECT * FROM farmacologia WHERE ID='" + Farmacologia_ID + "'";
            comando = new MySqlCommand(query, connection);
            dataReader = comando.ExecuteReader();
            modelo.Farma = new Farmacologia();
            while (dataReader.Read())
            {
                modelo.Farma.ID = (int)dataReader["ID"];
                modelo.Farma.ActividadFarmacologica = (String)dataReader["ActividadFarmacologica"];
                modelo.Farma.ActividadMiscelanea = (String)dataReader["ActividadMiscelanea"];
                modelo.Farma.FarmacologiaClinica = (String)dataReader["FarmacologiaClinica"];
            }
            connection.Close();

            //Busqueda de los datos en plantas_has_usuarios
            connection.Open();
            query = "SELECT * FROM plantas_has_usuarios WHERE Plantas_ID='" + modelo.ID + "'";
            comando = new MySqlCommand(query, connection);
            dataReader = comando.ExecuteReader();
            modelo.usuario = new Usuario();
            while (dataReader.Read())
            {
                modelo.usuario.ID = (int)dataReader["usuarios_ID"];
            }
            connection.Close();

            //Busqueda de los datos en usuarios
            connection.Open();
            query = "SELECT * FROM usuarios WHERE ID='" + modelo.usuario.ID + "'";
            comando = new MySqlCommand(query, connection);
            dataReader = comando.ExecuteReader();
            while (dataReader.Read())
            {
                modelo.usuario.Nombre = (String)dataReader["Nombre"];
                modelo.usuario.id_cat = (int)dataReader["Categoria"];
                modelo.usuario.usuario = (String)dataReader["Usuario"];
            }
            connection.Close();
            ViewBag.departamentos = departamentos;
            return View(modelo);
        }

        public ActionResult buscarPlanta(BuscarPlanta BP) 
        {

            ViewBag.autenticado = TempData["IS"];
            TempData["IS"] = ViewBag.autenticado;
            ViewBag.categoria = TempData["Categoria"];
            TempData["Categoria"] = ViewBag.categoria;
            ViewBag.NombreUsuario = TempData["NombreUsuario"];
            TempData["NombreUsuario"] = ViewBag.NombreUsuario;
            ViewBag.Usuario_objeto = TempData["Usuario_objeto"];
            TempData["Usuario_objeto"] = ViewBag.Usuario_objeto;


            BP.categorias = CategoriasRepository.GetAll().ToList();

            if (ModelState.IsValid)
            {
                server = "localhost";
                database = "atlas_de_plantas_medicinales";
                uid = "root";
                password = "123456";
                string connectionString;
                connectionString = "SERVER=" + server + ";" + "DATABASE=" +
                database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
                String query1 = "", query2 = "", query3 = "", query4 = "", query5 = "", query6 = "", query7 = "";
                bool query1Flag = false, query2Flag = false, query3Flag = false, query4Flag = false, query5Flag = false, query6Flag = false, query7Flag = false;                

                if (BP.PostedCategorias.IdsCategorias.Length != 0)
                {
                    //uno por uno

                    //NombreCientifico
                    //Familia
                    //Definicion
                    //Sinonimo
                    //Descripcion

                    
                    query1 += "SELECT * FROM plantas WHERE ";
                    query2 += "SELECT * FROM plantadeinteres WHERE ";
                    query3 += "SELECT * FROM pruebadepureza WHERE ";
                    query4 += "SELECT * FROM ensayoquimico WHERE ";
                    query5 += "SELECT * FROM linkpadecimiento WHERE ";
                    query6 += "SELECT * FROM usomedicinal WHERE ";
                    query7 += "SELECT * FROM farmacologia WHERE ";

                    bool flag = false;                    
                    for (int i = 0; i<BP.PostedCategorias.IdsCategorias.Length; i++)
                    {
                        int index = Convert.ToInt16(BP.PostedCategorias.IdsCategorias[i]);
                        if (flag == true)
                        {
                            if ((index >= 1 && index <= 7) || (index == 12) || (index >= 38 && index <= 43))
                                query1 += "OR " + BP.categorias[index-1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                        }
                        else
                        {
                            if ((index >= 1 && index <= 7) || (index == 12) || (index >= 38 && index <= 43))
                            {
                                query1 += BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                                query1Flag = true;
                                flag = true;
                            }                            
                        }
                    }


                    flag = false;
                    for (int i = 0; i < BP.PostedCategorias.IdsCategorias.Length; i++)
                    {
                        int index = Convert.ToInt16(BP.PostedCategorias.IdsCategorias[i]);
                        if (flag == true)
                        {
                            if (index >= 8 && index <= 11)
                                query2 += "OR " + BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                        }
                        else
                        {
                            if (index >= 8 && index <= 11)
                            {
                                query2 += BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                                query2Flag = true;
                                flag = true;
                            }
                        }
                    }

                    flag = false;
                    for (int i = 0; i < BP.PostedCategorias.IdsCategorias.Length; i++)
                    {
                        int index = Convert.ToInt16(BP.PostedCategorias.IdsCategorias[i]);
                        if (flag == true)
                        {
                            if (index >= 13 && index <= 22)
                                query3 += "OR " + BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                        }
                        else
                        {
                            if (index >= 13 && index <= 22)
                            {
                                query3 += BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                                query3Flag = true;
                                flag = true;
                            }
                        }
                    }

                    flag = false;
                    for (int i = 0; i < BP.PostedCategorias.IdsCategorias.Length; i++)
                    {
                        int index = Convert.ToInt16(BP.PostedCategorias.IdsCategorias[i]);
                        if (flag == true)
                        {
                            if (index >= 23 && index <= 24)
                                query4 += "OR " + BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                        }
                        else
                        {
                            if (index >= 23 && index <= 24)
                            {
                                query4 += BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                                query4Flag = true;
                                flag = true;
                            }
                        }
                    }

                    flag = false;
                    for (int i = 0; i < BP.PostedCategorias.IdsCategorias.Length; i++)
                    {
                        int index = Convert.ToInt16(BP.PostedCategorias.IdsCategorias[i]);
                        if (flag == true)
                        {
                            if (index >= 27 && index <= 34)
                                query5 += "OR " + BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                        }
                        else
                        {
                            if (index >= 27 && index <= 34)
                            {
                                query5 += BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                                query5Flag = true;
                                flag = true;
                            }
                        }
                    }

                    
                    flag = false;
                    for (int i = 0; i < BP.PostedCategorias.IdsCategorias.Length; i++)
                    {
                        int index = Convert.ToInt16(BP.PostedCategorias.IdsCategorias[i]);
                        if (flag == true)
                        {
                            if (index >= 25 && index <= 26)
                                query6 += "OR " + BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                        }
                        else
                        {
                            if (index >= 25 && index <= 26)
                            {
                                query6 += BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                                query6Flag = true;
                                flag = true;
                            }
                        }
                    }

                    flag = false;
                    for (int i = 0; i < BP.PostedCategorias.IdsCategorias.Length; i++)
                    {
                        int index = Convert.ToInt16(BP.PostedCategorias.IdsCategorias[i]);
                        if (flag == true)
                        {
                            if (index >= 35 && index <= 37)
                                query7 += "OR " + BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                        }
                        else
                        {
                            if (index >= 35 && index <= 37)
                            {
                                query7 += BP.categorias[index - 1].nombre + " LIKE '%" + BP.porBuscarPlanta + "%' ";
                                query7Flag = true;
                                flag = true;
                            }
                        }
                    }
                }
                else
                {
                    //la general
                    query1 = "SELECT * FROM Plantas";
                    query1Flag = true;
                }

                MySqlCommand comando;
                MySqlDataReader dataReader;
                List<int> iPlantas = new List<int>();
                
                if (query1Flag)
                {
                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(query1, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int inPlanta = (int)dataReader["ID"];
                        if (!iPlantas.Contains(inPlanta))
                            iPlantas.Add(inPlanta);
                    }
                    connection.Close();
                }

                List<int> iPlantasInteres = new List<int>();
                if (query2Flag)
                {
                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(query2, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int iPlantaDeInteres = (int)dataReader["ID"];
                        iPlantasInteres.Add(iPlantaDeInteres);
                    }
                    connection.Close();
                }

                List<int> iPruebaPureza = new List<int>();
                if (query3Flag)
                {
                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(query3, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int iPruebaDePureza = (int)dataReader["ID"];
                        iPruebaPureza.Add(iPruebaDePureza);
                    }
                    connection.Close();
                }

                List<int> iEnsayoQuimico = new List<int>();
                if (query4Flag)
                {
                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(query4, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int inEnsayoQuimico = (int)dataReader["ID"];
                        iEnsayoQuimico.Add(inEnsayoQuimico);
                    }
                    connection.Close();
                }

                List<int> iLinkPadecimiento = new List<int>();                    
                if (query5Flag)
                {
                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(query5, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int iLinkDePadecimiento = (int)dataReader["ID"];
                        iLinkPadecimiento.Add(iLinkDePadecimiento);
                    }
                    connection.Close();
                }

                List<int> iUsoMedicinal = new List<int>();                    
                if (query6Flag)
                {
                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(query6, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int inUsoMedicinal = (int)dataReader["ID"];
                        iUsoMedicinal.Add(inUsoMedicinal);
                    }
                    connection.Close();
                }

                List<int> iFarmacologia = new List<int>();
                if (query7Flag)
                {
                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(query7, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int inFarmacologia = (int)dataReader["ID"];
                        iFarmacologia.Add(inFarmacologia);
                    }
                    connection.Close();
                }

                // Link padecimiento

                String queryAux;
                bool bandera;
                if (iLinkPadecimiento.Count == 0)
                    query5Flag = false;
                if (query5Flag)
                {
                    queryAux = "SELECT * from usomedicinal WHERE ";
                    bandera = true;
                    foreach (int i in iLinkPadecimiento)
                        if (bandera)
                        {
                            queryAux += "LinkPadecimiento_ID ='" + i + "'";
                            bandera = false;
                        }
                        else
                            queryAux += "OR LinkPadecimiento_ID ='" + i + "'";

                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(queryAux, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int inUsoMedicinal = (int)dataReader["ID"];
                        if (!iUsoMedicinal.Contains(inUsoMedicinal))
                            iUsoMedicinal.Add(inUsoMedicinal);
                    }
                    connection.Close();
                    query6Flag = true;
                }

                //Uso medicinal

                if (iUsoMedicinal.Count == 0)
                    query6Flag = false;
                if (query6Flag)
                {
                    queryAux = "SELECT * from plantas WHERE ";
                    bandera = true;
                    foreach (int i in iUsoMedicinal)
                        if (bandera)
                        {
                            queryAux += "UsoMedicinal_ID ='" + i + "'";
                            bandera = false;
                        }
                        else
                            queryAux += "OR UsoMedicinal_ID ='" + i + "'";

                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(queryAux, connection);
                    dataReader = comando.ExecuteReader();
                    iPlantas = new List<int>();
                    while (dataReader.Read())
                    {
                        int inPlantas = (int)dataReader["ID"];
                        if (!iPlantas.Contains(inPlantas))
                            iPlantas.Add(inPlantas);
                    }
                    connection.Close();
                }

                //Planta de interes

                if (iPlantasInteres.Count == 0)
                    query2Flag = false;
                if (query2Flag)
                {
                    queryAux = "SELECT * from plantas WHERE ";
                    bandera = true;
                    foreach (int i in iPlantasInteres)
                        if (bandera)
                        {
                            queryAux += "PlantaDeInteres_ID ='" + i + "'";
                            bandera = false;
                        }
                        else
                            queryAux += "OR PlantaDeInteres_ID ='" + i + "'";

                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(queryAux, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int inPlantas = (int)dataReader["ID"];
                        if (!iPlantas.Contains(inPlantas))
                            iPlantas.Add(inPlantas);
                    }
                    connection.Close();
                }
                
                //Prueba de pureza

                if (iPruebaPureza.Count == 0)
                    query3Flag = false;
                if (query3Flag)
                {
                    queryAux = "SELECT * from plantas WHERE ";
                    bandera = true;
                    foreach (int i in iPruebaPureza)
                        if (bandera)
                        {
                            queryAux += "PruebaDePureza_ID ='" + i + "'";
                            bandera = false;
                        }
                        else
                            queryAux += "OR PruebaDePureza_ID ='" + i + "'";

                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(queryAux, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int inPlantas = (int)dataReader["ID"];
                        if (!iPlantas.Contains(inPlantas))
                            iPlantas.Add(inPlantas);
                    }
                    connection.Close();
                }

                //Ensayo quimico

                if (iEnsayoQuimico.Count == 0)
                    query4Flag = false;
                if (query4Flag)
                {
                    queryAux = "SELECT * from plantas WHERE ";
                    bandera = true;
                    foreach (int i in iEnsayoQuimico)
                        if (bandera)
                        {
                            queryAux += "EnsayoQuimico_ID ='" + i + "'";
                            bandera = false;
                        }
                        else
                            queryAux += "OR EnsayoQuimico_ID ='" + i + "'";

                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(queryAux, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int inPlantas = (int)dataReader["ID"];
                        if (!iPlantas.Contains(inPlantas))
                            iPlantas.Add(inPlantas);
                    }
                    connection.Close();
                }

                //Farmacologia

                if (iFarmacologia.Count == 0)
                    query7Flag = false;
                if (query7Flag)
                {
                    queryAux = "SELECT * from plantas WHERE ";
                    bandera = true;
                    foreach (int i in iFarmacologia)
                        if (bandera)
                        {
                            queryAux += "Farmacologia_ID ='" + i + "'";
                            bandera = false;
                        }
                        else
                            queryAux += "OR Farmacologia_ID ='" + i + "'";

                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(queryAux, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        int inPlantas = (int)dataReader["ID"];
                        if (!iPlantas.Contains(inPlantas))
                            iPlantas.Add(inPlantas);
                    }
                    connection.Close();
                }

                List<ArticuloCientifico> listaDePlantas = new List<ArticuloCientifico>();                    
                if (iPlantas.Count != 0)
                {
                    queryAux = "SELECT * from plantas WHERE ";
                    bandera = true;
                    foreach (int i in iPlantas)
                        if (bandera)
                        {
                            queryAux += "ID ='" + i + "'";
                            bandera = false;
                        }
                        else
                            queryAux += "OR ID ='" + i + "'";

                    connection = new MySqlConnection(connectionString);
                    connection.Open();
                    comando = new MySqlCommand(queryAux, connection);
                    dataReader = comando.ExecuteReader();
                    while (dataReader.Read())
                    {
                        ArticuloCientifico PlantaTemp = new ArticuloCientifico();
                        PlantaTemp.ID = (int)dataReader["ID"];
                        PlantaTemp.NombreCientifico = (String)dataReader["NombreCientifico"];
                        PlantaTemp.Familia = (String)dataReader["Familia"];
                        PlantaTemp.Definicion = (String)dataReader["Definicion"];
                        PlantaTemp.Sinonimo = (String)dataReader["Sinonimo"];
                        PlantaTemp.Descripcion = (String)dataReader["Descripcion"];
                        PlantaTemp.comoBorrador = (bool)dataReader["Borrador"];
                        PlantaTemp.Habilitado = (bool)dataReader["Habilitada"];
                        listaDePlantas.Add(PlantaTemp);
                    }
                    connection.Close();
                }

                ViewData["datosPlanta"] = listaDePlantas;
                ViewBag.busqueda = true;
                return View("Index", GetPModel(BP));
            }
            return RedirectToAction("Index","Home");
        }
    }
}